#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>



int main(int argc, char *argv[])
{

printf("process is running...\n");
pid_t id  = fork();
assert(id != -1);
if(id==0)
{
    sleep(1);

    //main函数的参数 argv[0]是我们的程序名 第二个是ls 第三及后面就是选项 ./exec ls -a -l -> "./exec" "ls" "-a" "-l"
     execvp(argv[1], &argv[1]);
    
     
     //execl("/usr/bin/ls","ls","-a","-l",NULL);

    //execlp("ls","ls","-a","-l",NULL);//不用在写程序的完整路径了只写程序名函数会自动在环境变量里面找对应名字的程序

    //char* const argv_[]={
    //bin    "ls",
    //    "-a",
    //    "-l",
    //    NULL
    //};
    //execv("/usr/bin/ls",argv_);//将所有的执行参数写到数组里面，而不用进行可变参数的方案
    
    //execvp("ls",argv_);
    //
    //只要是程序就可以去替换 无论是什么语言写的只要是可运行的程序就可以
    //execl("./mybin","mybin",NULL);

    char* const envp_[]={
        (char*)"MYENV=112233445566",
        NULL
    };
    extern char** environ;
    
   // execle("./mybin","mybin",NULL,envp_); // 自定义环境变量
   // putenv((char*)"MYENV=11223344");//将指定环境变量添加到系统中，也就是environ指向的对应的环境变量表中
   // execle("./mybin","mybin",NULL,environ);//系统环境变量 实际上默认环境变量就算你不传，子程序也能获取



    exit(1);
}

int status = 0;
pid_t ret = waitpid(id, &status, 0);
if(ret>0)
    printf("wait success: exit code: %d, sig: %d\n", (status>>8)&0xFF, status & 0x7F);












   // printf("process is ruuning\n");
    //execl("/usr/bin/ls","ls","-a","-l",NULL);//第一个参数是要执行的程序的路径 第二个参数是执行程序名  第三或者以上个参数是执行程序的参数（可省略）例如 ls是程序名 -a是参数
    //所有的exec函数都要以NULL的参数结尾
    //execl只要返回了就一定错误了因为成功的话就会替换就不会有返回值
    //perror("execl");//打印错误信息

    //在execl执行后程序替换后代码已经被全部覆盖了执行的是新的代码所以这个printf不执行
    //printf("process ruuning done...\n");
}
